/*
 * Copyright 2009 Johnson Consulting Services
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.johnsoncs.gwt.widgets.samples.client.mock;

import java.util.List;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.johnsoncs.gwt.widgets.client.common.events.BusyStateChangeEvent.BusyState;
import com.johnsoncs.gwt.widgets.client.dynamictable.Row;
import com.johnsoncs.gwt.widgets.client.dynamictable.TableException;
import com.johnsoncs.gwt.widgets.client.dynamictable.TableModel;

public class MyTableModel extends TableModel<MyRowObject> {
	private final MockRemoteTableModelAsync service = MockRemoteTableModel.Util.getService();
	private int rowCount = -1;

	private MockFilter getMockFilter() {
		return (MockFilter) super.getFilter();
	}

	@Override
	public String getUniqueIdentifier(final MyRowObject value) {
		return value.getId();
	}

	@Override
	public void refresh() {
		requestRowCount();
	}

	private void requestRowCount() {
		fireBusyStateChange(BusyState.BUSY);
		service.requestRowCount(getMockFilter(), new AsyncCallback<Integer>() {
			@Override
			public void onFailure(final Throwable caught) {
				fireBusyStateChange(BusyState.READY);
				throw new TableException("Unable to retrieve row count", caught);
			}

			@Override
			public void onSuccess(final Integer result) {
				fireBusyStateChange(BusyState.READY);
				rowCount = result;
				fireModelChangeEvent(rowCount);
			}
		});
	}

	@Override
	public void requestRows(final int start, final int count, final AsyncCallback<List<Row<MyRowObject>>> callback) {
		fireBusyStateChange(BusyState.BUSY);
		service.requestRows(start, count, super.getSortInfo(), getMockFilter(),
				new AsyncCallback<List<Row<MyRowObject>>>() {

					@Override
					public void onFailure(final Throwable caught) {
						fireBusyStateChange(BusyState.READY);
						callback.onFailure(caught);
					}

					@Override
					public void onSuccess(final List<Row<MyRowObject>> result) {
						fireBusyStateChange(BusyState.READY);
						callback.onSuccess(result);
					}

				});
	}

}